package NO1_Array;

/**
 * 2025-08-27
 * 力扣 - 209. 长度最小的子数组
 * <p>
 * 给定一个含有 n 个正整数的数组和一个正整数 target 。
 * 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ，
 * 并返回其长度。如果不存在符合条件的子数组，返回 0 。
 */
public class MinSubArrayLenMain {
    public static void main(String[] args) {
        System.out.println(minSubArrayLen(7, new int[]{2, 3, 1, 2, 4, 3}));
    }

    public static int minSubArrayLen(int target, int[] nums) {
        int left = 0; // 左窗口
        int currentSum = 0; // 当前总和
        int minLen = Integer.MAX_VALUE; // 最小长度

        // 右窗口从0开始，向右移动
        for (int right = 0; right < nums.length; right++) {
            currentSum += nums[right];

            // 当当前总和大于等于目标值时，缩小左窗口
            while (currentSum >= target) {
                minLen = Math.min(minLen, right - left + 1);
                currentSum -= nums[left];
                left++;
            }
        }

        return minLen == Integer.MAX_VALUE ? 0 : minLen;
    }
}
